【python】 可变对象,赋值 的变化比较

# 值传递,引用传递 
l11=[1,2,3]
l21=l11
l11.append(4)
print(l11)
print('-------')
print(l21)

'''
对象自身发生改变,并不创建新的对象,两个对象同时指向原来的列表 
[1, 2, 3, 4]
-------
[1, 2, 3, 4]

'''

print('2222222222222222222222222')

l11=[1,2,3]
l21=l11
l11=l11+[4]
print(l11)
print('-------')
print(*l21)
'''
变量赋值,只是这个变量指向了新的对象
而l21 这个变量 依旧指向原来的对象
[1, 2, 3, 4]
-------
1 2 3


'''
print('---------- func 1----------')
# def 对于改变

def my_func1(b):
b=2
a=1
my_func1(a)
#print(my_func(a))
print(a)
# a还是1

print('------------ func 2 -----------')
def my_func2(b):
b=2
return b
a=1
a=my_func2(a)
print(a)
# 结果是2


la=[1,2,3]
lb=[1,2,3]
lc=lb
print(id(la))
print(id(lb))
print(id(lc))

print('------------ func 1 -----------')
def func(d):
d['a']=10
d['b']=20
d={'a':1,'b':2}
return d
d={}
print(func(d)) # 1,2
print(d) # 10,20
d=func(d) 
print(d) # 1,2

print('------------ func 2 -----------')
def func2(e):
e['a']=10
e['b']=20
e={'a':1,'b':2}
e['c']=30 # 后来验证 这个都没有改变e本身
print(e)
#return d
e={}
print(func2(e)) # 1,2
print(e) # 10,20
func2(e) # 1,2, 30
print(e) # 10,20

# 其实 d 和 e 这两个例子 我并不真正完全理解,只能近似想成
# e={'a':1,'b':2} 这个动作 让e 进行了一次新的赋值,这时候其实 e 的对象状态是有两个的, 
# 全局上 是保留了第一次 提交状态 也就是 10,20 ,,, 而在函数内部 则 被后续步骤改造成 1,2,30

 

 

小结:

改变对象本身的动作, append ,pop, 经过 含有return步骤的 func调用,并赋值

不改变对象本身的动作, 简单的赋值

 

posted @ 2019-06-16 11:29  allen514519  阅读(372)  评论(0)    收藏  举报