2016-07-05 66 views
0

我正在爲我正在處理的遊戲編制庫存系統,至此我已爲系統編寫了這些代碼塊。我希望系統在不使用全局函數的情況下工作,因爲我已經讀過,應該避免使用全局函數。如何在不使用全局函數的情況下在我的代碼中引用局部變量

while not done: 
    global inventory 
    pygame.mouse.set_visible(False) 
    #Event processing 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      done = True 
    elif event.type == pygame.KEYDOWN: 
     if event.key == pygame.K_i: 
      inv_sys.inventory = True 
      inv_sys.inventory_u() 

import pygame 
import Constants 

clock = pygame.time.Clock() 
screen = pygame.display.set_mode(Constants.screen_size) 
inv = pygame.image.load("inv.png").convert() 
test = False 

def uninventory(): 
    global inventory 
    inventory = False 

def inventory_u(): 

    while inventory: 
     pygame.mouse.set_visible(True) 
     screen.blit(inv,(0,0)) 
     for event in pygame.event.get(): 

      if event.type == pygame.QUIT: 
       pygame.quit 
      elif event.type == pygame.KEYDOWN:  
       if event.key == pygame.K_i: 
        uninventory() 

     pygame.display.update() 
     clock.tick(60) 

提前謝謝你的幫助!

回答

0

考慮爲什麼要在多個函數之間共享一個局部變量? 也許更好的方法是創建一個類,其中inventory或更具描述性的內容將作爲對象變量。

class MyGame: 
    def __init__(): 
     # something 
     self.inventory = True 
    # some code 
    def unEquip(): 
     self.inventory = False 
2

,因爲我讀過,你應該避免使用[全球語句]

我認爲你誤解了。 global關鍵字本身並不壞。相反,如果您的實施需要使用global關鍵字,那麼您的實施是不好的(在大多數情況下,儘管可能有例外)。不要用全局範圍的變量編寫代碼,而應該嘗試將變量傳遞給函數。

def main(): 
    eels = 42 
    start_hovercraft(eels) 

def start_hovercraft(number_of_eels): 
    if number_of_eels > 3: 
     raise Exception("My hovercraft is full of eels!") 

@使用一個類的PatNowak的建議也是解決問題的好辦法,但問題的要點是,你應該避免global只要有可能,因爲它會導致不良代碼:

1

一般而言,如果您經常引用一個變量,其值只能分配一次而沒有更改,請根據PEP 8 style guide將其定義在靠近文件頂部的模塊範圍內,因此對於任何讀取您的代碼的人來說,它顯然是不變的。您的進口報表也應該位於文件的頂部。

如果它是程序中引用的內容並用於更改程序的狀態,就像您使用global inventory一樣,它(以及引用它的方法)應該可能是類定義的一部分,該類定義具有像PatNowak所描述的那樣,作爲一種財產變量。您可以在類內部或外部引用這些方法(分別使用self或類實例),但屬性本身只能在類內部直接更改,否則代碼很快無法調試或重寫。

全局關鍵字有它的用途,但我從來沒有理由使用它,而不是其他兩種方法之一。

相關問題