Quelque chose qui semble avoir été vu quelque part.
In[1]
def a():
print('a')
f = a
f()
def a():
print('b')
f()
Out[1]
a
a
Il en va de même pour λ.
In[2]
a = lambda: print('a')
f = a
f()
a = lambda: print('b')
f()
Out[2]
a
a
S'il ne s'agit pas d'une affectation, il se comporte comme «prévu».
In[3]
a = [1]
f = a
print(f)
a.append(1)
print(f)
a = [2]
a.append(2)
print(f)
Out[3]
[1]
[1, 1]
[1, 1]
Les détails sont comme commentés.
Essayons ce qui se passe lorsque nous l'affectons dans une fonction!
In[4]
l = 1
def a():
l = 2
a()
l
Out[4]
1
L'activité destructrice a échoué avec succès. Mais utiliser des listes peut être destructeur! dangereux!
In[5]
l = [1]
def a():
l[0] = 2
a()
l[0]
Out[5]
2
Dokan ... Le point (?) De cette activité destructrice est que vous pouvez changer le contenu sans le passer en argument. Cela se produit certainement lorsque vous définissez des variables dans une fonction et utilisez des fermetures.
PyCharm donne un message aimable comme celui-ci, alors je l'ai essayé.
Default argument value is mutable
This inspection detects when a mutable value as list or dictionary is detected in a default value for an argument. Default argument values are evaluated only once at function definition time, which means that modifying the default value of the argument will affect all subsequent calls of the function.
In[6]
def a(x=[]):
x.append(1)
return x
a()
a()
a()
Out[6]
[1,1,1]
Quoi! ?? De même, ce qui suit peut être fait.
In[7]
def a(x=[0]):
x[0] += 1
return x[0]
a()
a()
a()
Out[7]
3
Recommended Posts