Skip to content

Instantly share code, notes, and snippets.

@lxyu
Created December 20, 2013 13:44
Show Gist options
  • Save lxyu/8054956 to your computer and use it in GitHub Desktop.
Save lxyu/8054956 to your computer and use it in GitHub Desktop.
python for loop scope
import copy
class B(object):
def __init__(self, name):
self.name = name
class A(object):
def __init__(self):
self.apps = {}
def create_app(self, name):
app = B(name)
if name not in self.apps:
self.apps[name] = app
return app
a = A()
b1 = a.create_app("111")
b2 = a.create_app("222")
b3 = a.create_app("333")
for name, app in a.apps.items():
app.get_name = lambda: name
for name, app in a.apps.items():
app.get_name2 = lambda name=name: name
for name, app in a.apps.items():
new_name = copy.deepcopy(name)
def namegetter():
return new_name
app.get_name3 = namegetter
for name, app in a.apps.items():
new_name = copy.deepcopy(name)
def f(new_name):
def namegetter():
return new_name
app.get_name4 = namegetter
f(new_name)
print(b1.get_name())
print(b2.get_name())
print(b3.get_name())
print(b1.get_name2())
print(b2.get_name2())
print(b3.get_name2())
print(b1.get_name3())
print(b2.get_name3())
print(b3.get_name3())
print(b1.get_name4())
print(b2.get_name4())
print(b3.get_name4())
@tallmad
Copy link

tallmad commented Dec 22, 2013

掉坑里了。
ps:

def create_app(self, name):
        if name not in self.apps:
            self.apps[name] = B(name)
        return self.apps[name]

@zzz6519003
Copy link

def create_app(self, name):
if name not in self.apps:
self.apps[name] = B(name)
return self.apps[name]
这段有问题么~

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment