簡體   English   中英

必須使用global來訪問LOCAL變量(不知道為什么)python; Kivy

[英]Must use global to access LOCAL variable (no idea why) python; Kivy

我最近下載了Kivy,因為它給了我最易於理解的教程和文檔等等。我嘗試過pygame和cocos,但從來沒有得到過基礎,而且對於Kivy來說,這很容易。

繼續我的問題,我做了一個乒乓球比賽,我試圖通過停止乒乓球來暫停比賽,然后在取消暫停時(通過改變其速度)再次啟動它。

這是我的代碼:

class PongGame(Widget):
   ...

    def _on_keyboard_down(self, keyboard, keycode, text, modifiers):
        if keycode[1] == 'escape':
        #Why doesnt it work without global?
        #If I don't use a global i get "tempBallVelocity referenced before assignment
            global tempBallVelocity
            tempBallVelocity = self.ball.velocity
            self.ball.velocity = 0,0


        if keycode[1] == '`':
            #Make the ball go again, thus exiting pause
            #This is where the error occurs if I don't use global
            self.ball.velocity = tempBallVelocity   

正如您在注釋中看到的那樣,如果我不使用global,我會在賦值錯誤之前被引用。 但它是一個局部變量,我不明白為什么會發生這種情況。

有人有想法么? 謝謝?

編輯:為了確保每個人都清楚我的意圖,我不想使用全局,但它是唯一可行的方式。 我寧願不使用全局變量。

你的函數里面的代碼沒有縮進,只是一個復制錯誤? 如果不是,我想知道為什么你沒有得到錯誤。

編輯:好的,當您使用'escape'調用函數時,很容易設置變量tempBallVelocity ,但隨后函數退出並松開變量。 如果你用' tempBallVelocity '調用它你還沒有設置變量tempBallVelocity ,最好的解決方案可能是: self.tempBallVelocity = self.ball.velocity

如果再次修復縮進錯誤,您將看到:您可以看到:

  1. escape escape應該在沒有global的情況下工作,但tempBallVelocity將被視為局部變量。 如果要修改全局變量,則需要添加全局聲明以告訴python tempBallVelocity不是本地的,而是全局的。

  2. 在第二種情況下,如果未輸入轉義塊,則不會在本地初始化tempBallVelocity ,因此不能將其用作本地RValue 在這種情況下,python應該在類之外查找變量。 tempBallVelocity真的是一個全局變量嗎?

備注:如果案件是獨家的,你應該使用elif代替if而不是第二種情況。

每次在一個標識的代碼塊中設置一個變量時,一旦你離開那個塊,變量就會被銷毀,回到之前的標識中;

如果你寫

if True:
    foo = 'foo value, which is a string (?)'
    print foo

在一個巨大的腳本里面,python只處理foo變量,當它在if語句里面時,一旦它結束並退出,foo就完全被遺忘以便讓事情變得更快,可以理解,如果你把變量設置在一個內部聲明,你只會在聲明中使用它。

如果你想做這樣的事情

if True:
    foo = 'foo value'

# Right now foo has been trashed

if True:
    print foo
    # Raises an error

你必須在'if'語句之外設置foo變量

foo = ''

if True:
    foo = 'foo value'

# Right now foo still exists and keeps it's recently changed value

if True:
    print foo
    # prints 'foo value'

或者你也可以通過將foo設置為全局變量來實現它,這樣一旦你超出'if'語句就不會銷毀它

if True:
    global foo
    foo = 'foo value'

# foo still exists as it's a global variable

if True:
    print foo
    # There's no reason so it wouldn't work

但是在大多數情況下這可能是不必要的和令人困惑的,如果你開始把所有東西都變成全局的話,甚至會有問題,所以你只使用過一次的變量就會在你的設備內存中無用地累積。

現在你正在編寫一個類,所以正確地做你正在做的事情就是(從我的觀點來看)在類中存儲'tempBallVelocity'變量就像這樣

class PongGame(Widget):
   ...

    def _on_keyboard_down(self, keyboard, keycode, text, modifiers):
        if keycode[1] == 'escape':
            self.tempBallVelocity = self.ball.velocity
            self.ball.velocity = 0,0


        if keycode[1] == '`':
            self.ball.velocity = self.tempBallVelocity   

看起來它不尊重我剛剛告訴你的規則,但這里的事情是,當你寫'self.tempBallVelocity = ...'時,你在自我中存儲信息,這是PongGame對象的快捷方式你將實例化以運行游戲,這將運行該方法,因此當你拿出方法時,變量會存儲在那里。

我希望這個答案對你有所幫助,你應該對python有更深入的了解, 學習Python The Hard Way是一本書的網站,里面有一個對我有用的免費html版本。

再見! :d

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM