一個python3.x代碼演示:
def fun():
global x
y.append(6)
x = 6
x = 3
y = [3]
print(x, y, fun(), x, y)
該段輸出:
3 [3, 6] None 6 [3, 6]
如果print()計算所有專案的程序然后輸出專案,那么這就解釋了為什么ybeforefun()和 after的結果fun()都是[3, 6],因為它們在這里。但是為什么x函式之前和之后的值fun()不同呢?
uj5u.com熱心網友回復:
當您呼叫一個函式時,就像print在您的示例中一樣,引數是從左到右評估的。
您的電話有x兩次作為引數。第一個使用原始值進行評估,3。然后fun()被呼叫,它具有改變全域變數的副作用x。當您x之后再次評估時,您將獲得更新后的值,6。
如果您對所有引數使用函式呼叫,可能會更清楚一些,因為這也可以讓您列印一些輸出:
def get_x():
print("x is", x)
return x
def change_x():
global x
x = 1
print("x changed")
x = 0
print("args evaluated left to right:", get_x(), change_x(), get_x())
輸出是:
x is 0
x changed
x is 1
args evaluated left to right: 0 None 1
uj5u.com熱心網友回復:
這個鏈接很好地解釋了變數賦值。https://nedbatchelder.com/text/names.html:
事實:Python 通過賦值來傳遞函式引數。例如 :
def fn(a):
pass
x = 10
當我們說fn(x),它會是a = x。另一個規則是從左到右評估引數。
在說完這兩個規則之后,讓我以與我們的示例匹配的特定方式重新撰寫 print 函式:
def print_(var1, var2, var3, var4, var5, sep=' ', end='\n'):
sys.stdout.write(str(var1) sep)
sys.stdout.write(str(var2) sep)
sys.stdout.write(str(var3) sep)
sys.stdout.write(str(var4) sep)
sys.stdout.write(str(var5) sep)
sys.stdout.write(end)
print_(x, y, fun(), x, y)
Python 將全域的值保存在x區域變數var1中。
var1 = x # `x` is 3 now
fun()函式執行后, xin 全域變為6,但點var1仍然是 3 而不是 6:
var1 = x = 3
x = 6
print(var1) # 3
...并且print_將使用它的區域變數(var1not x)。
但是從現在開始,只要 Python 看到x,它就會存盤6。6也是var4。
var4 = x # `x` is 6 now
但是由于y是一個串列并且你改變了串列,兩者var2都y看到了變化!因為它們都指向同一個物件:
var2 = y = [3]
y.append(6)
print(var2) # [3, 6]
uj5u.com熱心網友回復:
該函式print復制區域變數中的引數,但每個引數都是不同的區域變數,并且從左到右計算。給你的線路會發生什么print( x, y, func(), x, y):
1. x 在區域變數中被評估和復制。xLocal1 = x = 3
2. y 被評估并復制到區域變數中。yLocal1 = [3]
3. func() 被評估,它同時改變并且x 因為 有一個指定它只適用于全域變數而不是區域變數。. 它改變了上一步的變數yLocal1yglobal xx = 6, yLocal1 = [3,6], y = [3,6]
4. x 在 xLocal2 中被評估和復制。xLocal2 = x = 6
5. y 在 yLocal2 中計算和復制。yLocal2 = y = [3,6]
6.最后列印所有xLocal1, yLocal1, xLocal2 and yLocal2等于的區域變數3, [3,6], 6, [3,6]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/432192.html
標籤:Python python-3.x
