Ваша проблема в том, что Python работает не так, как вы думаете.
Поэтому я постараюсь объяснить, что происходит в вашем коде, строка за строкой.
mouse = "a"
Назначает строку "a"на имя mouse
.
background = "b"
Назначает строку "b" имени background
.
list_ab = [mouse, background]
Назначает два объекта, на которые ссылаются имена mouse
и background
, к списку list_ab
.
Как мы уже знаем, они являются константами "a" и "b".Таким образом, вы можете просто написать:
list_ab = ["a", "b"]
Теперь цикл
for item in list_ab:
присваивает каждому объекту в списке имя item
.
Для первой итерации цикла этоозначает item = "a"
.
Строка
global item # I want to modify the GLOBAL item, which is mouse ad background
не имеет смысла, потому что она пытается сообщить Python, что имя item
является глобальным, в то время как такой глобальной переменной нетобъявляется.
И для наиболее запутанного поведения в строке
item = "modified"
вы должны просто понимать, что, пока он присваивает строку «измененный» имени item
, строки «а»и "b" все те же, и все еще присваиваются списку list_ab
(и именам mouse
и background
, которые вы тоже не трогали).
Само имя item
живет только в той области, где оно было объявлено, когда цикл «for» заканчивается, он уничтожается.Он также переназначается для каждой итерации со следующим элементом из list_ab
.
Подводя итог:
Если вы хотите назначить «измененную» строку дляэлементы в списке, делайте это напрямую:
list_ab[0] = "modified"
list_ab[1] = "modified"
Если вам нужно изменить переменную, объявленную в глобальной области видимости, сделайте это:
mouse = "a"
def func():
global mouse # tell Python that you want to work with global variable
mouse = "modified"
func()
print mouse # now mouse is "modified"
Пример на основе первогоПересмотр вопроса:
Вместо
background = g_base("bg.jpg") # g_base class instance
mouse = g_base("mouse.png",alpha=1) # g_base class instance
imgs_to_load = [mouse, background]
def Image_loader (img):
# ..... code to load the image and convert it into pygame surface...
return img_load
def main ():
for image in img_to_load:
global image
image = Image_loader (img)
print image # if I print image, it is a pygame surface
print background # But here, outside the loop, image is still a g_base instance ?!?!
print mouse # " "
main()
Вы можете сделать:
imgs_to_load = [g_base("bg.jpg"), g_base("mouse.png",alpha=1)] # list with a g_base class instances
def Image_loader(img):
# ..... code to load the image and convert it into pygame surface...
return img_load
def main ():
imgs_in_pygame_format = [] # create an empty list
for image in imgs_to_load:
loaded_image = Image_loader(image)
imgs_in_pygame_format.append(loaded_image) # add to the list
for image in imgs_in_pygame_format:
print image # every image in the list is a pygame surface
# or
print image[0]
print image[1]
main()
Или, если вы хотите сослаться на изображения по имени, выможно поместить их в словарь:
imgs_to_load = {}
imgs_to_load["bg"] = g_base("bg.jpg")
imgs_to_load["mouse"] = g_base("mouse.png",alpha=1)
imgs_in_pygame_format = {} # create a global dictionary for loaded images
def main ():
global imgs_in_pygame_format # import that global name into the local scope for write access
for name, data in imgs_to_load.items():
imgs_in_pygame_format[name] = Image_loader(data) # add to the dictionary
for image in imgs_in_pygame_format:
print image # every image in the dictionary is a pygame surface
# or
print imgs_in_pygame_format["bg"]
print imgs_in_pygame_format["mouse"]
main()
Но самое главное, глобальные переменные - плохая идея .Лучшим решением было бы использовать класс:
def Image_loader(img):
# ..... code to load the image and convert it into pygame surface...
return img_load
class Image:
def __init__(self, image):
self.data = Image_loader(image)
def main ():
bg = Image(g_base("bg.jpg"))
mouse = Image(g_base("mouse.png",alpha=1))
print bg.data
print mouse.data
main()
Дополнительные примеры см. В Учебник по Python .
Надеюсь, это поможет, и добро пожаловать в StackOverflow!