使用這兩個函數來查看全局和當地變量的字典。
locals()不包括通過global獲取的變量。
globals()
locals()
函數內如果沒有某個變量的賦值語句,函數內可以訪問函數外的同名變量。
>>> import re
>>> a=0
>>> def sb():
print(re)
print(a+1)
return locals()
>>> sb()
<module 're' from 'G:\\360安全浏覽器下載\\Python\\Python37-32\\lib\\re.py'>
1
{
}
但如果函數內有某個變量的賦值語句,Python就會認為這是當地變量,可能會引發錯誤。
>>> def sb():
print(re)
print(a+1)
a=a+1
return locals()
>>> sb()
<module 're' from 'G:\\360安全浏覽器下載\\Python\\Python37-32\\lib\\re.py'>
Traceback (most recent call last):
File "<pyshell#31>", line 1, in <module>
sb()
File "<pyshell#30>", line 3, in sb
print(a+1)
UnboundLocalError: local variable 'a' referenced before assignment
函數內可以定義重名函數(不改變外層函數)。
>>> def sb():
print(re)
print(a+1)
def sb():
a=a+1
return locals()
>>> sb()
<module 're' from 'G:\\360安全浏覽器下載\\Python\\Python37-32\\lib\\re.py'>
1
{
'sb': <function sb.<locals>.sb at 0x01E575D0>}
>>> sb()
<module 're' from 'G:\\360安全浏覽器下載\\Python\\Python37-32\\lib\\re.py'>
1
{
'sb': <function sb.<locals>.sb at 0x020C18A0>}
還可以使用global獲取自己的函數名後再對函數本身重新定義。
>>> def sb():
print(re)
print(a+1)
global sb
def sb():
a=a+1
return locals()
>>> sb()
<module 're' from 'G:\\360安全浏覽器下載\\Python\\Python37-32\\lib\\re.py'>
1
{
}
>>> sb()
Traceback (most recent call last):
File "<pyshell#39>", line 1, in <module>
sb()
File "<pyshell#37>", line 6, in sb
a=a+1
UnboundLocalError: local variable 'a' referenced before assignment
定義同名函數或者為其賦值時,只從這兩個地址裡來回改變。
在兩個定義函數語句中間訪問的是上面那個函數,在兩個定義函數語句上面和下面訪問的是下面那個函數。
>>> for _ in [0]:
print(0,sb,sb())
def sb():
return False
print(1,sb,sb())
sb=1
print(2,sb)
def sb():
return True
print(3,sb,sb())
0 <function sb at 0x020C1858> True
1 <function sb at 0x020C1930> False
2 1
3 <function sb at 0x020C1930> True
>>> sb
<function sb at 0x020C1930>
>>> sb
<function sb at 0x020C1930>
>>> sb()
True
>>> def sb():
return True
>>> sb
<function sb at 0x020C1858>
>>> def sb():
return True
>>> sb
<function sb at 0x020C1930>
>>> def sb():
return True
>>> sb
<function sb at 0x020C1858>
>>> def sb():
return False
>>> sb
<function sb at 0x020C1930>
>>> def sb():
return False
>>> sb
<function sb at 0x020C1858>