個人推測結論:

可變物件傳引用,不可變物件傳值

python裡的變數不同於c中地址儲值模型

a=100
b=100
print(id(a),id(b),a==b,a is b) #8790877986944 8790877986944 True True

這兩個變數id相同,值相等,如果 a=a+1,a的id也變了 浮點數也是這樣

看成和str tuple一樣的不可變物件,實際操作可以改變,但都是副本操作

暫且管它叫不可變物件的副本操作

def f(x):
x+=100
return x
a=100
f(a) #直接傳變數 變數傳值
print(a) # 100 def fn(data):
for i in range(len(data)):
data[i]+=1
l = [3,5,7]
fn(l) #直接傳改變原物件 list傳引用
print(l) #[4, 6, 8] #以下是傳副本方式 不改變原物件
l2 = [1,2,3]
fn(l2.copy())
print(l2) #[1, 2, 3]
fn(l2[:])
print(l2) #[1, 2, 3] #str 不可變物件是傳值
s = "do you like me!"
def str_answer(s):
s=s+" No way!"
print(s)
str_answer(s)
print(s)
print(s.upper()) #return a copy
print(s)