a=[1,23,4,6,7]
b=a[2]
b=3
a
[1, 23, 4, 6, 7]
解释:b指向了一个新的变量3,a不会改变
def fun2(a):
a=5
fun2(a[0])
a
[1, 23, 4, 6, 7]
解释:函数内的参数a指向了一个新的变量5,但是对于列表a中的元素,a[0]并没有发生变化。
class Node:
def __init__(self):
self.x=3
a=[Node(),Node(),Node()]
b=a[1]
b.x=4
#from __future__ import print_function
for i in range(3):
print(a[i].x,end=' 'if i<2 else '\n')
3 4 3
解释:b.x=4即a[1].x=4
def fun(a):
a.x=5
fun(a[0])
for i in range(3):
print(a[i].x,end=' 'if i<2 else '\n')
5 4 3
解释:函数中的a.x=5,即a[0].x=5
class Node:
def __init__(self):
self.x=3
class Node2:
def __init__(self):
self.x='222'
def fun3(x):
x='sadadasd'
def fun4(x):
x=Node2()
a=[Node(),Node(),Node()]
fun3(a[2])
a[2].x
3
fun4(a[2])
a[2].x
3
fun(a[2])
a[2].x
5
解释:
这证明即使向函数的形参x传入一个复杂的自定义类型对象,如果中途将x指向另一个变量或对象,那么传入的对象就失去了控制。
def fun5(a):
a.x=1111
a='sssss'
fun5(a[2])
a[2].x
1111
a[2]
<main.Node at 0x2d622d68710>
lst=[Node()]*5
lst
[<main.Node at 0x2d622d656d8>,
<main.Node at 0x2d622d656d8>,
<main.Node at 0x2d622d656d8>,
<main.Node at 0x2d622d656d8>,
<main.Node at 0x2d622d656d8>]
lst[2]='sadasdasdsa'
ret=lst[3]
ret='asdasdsad'
lst
[<main.Node at 0x2d622d656d8>,
<main.Node at 0x2d622d656d8>,
‘sadasdasdsa’,
<main.Node at 0x2d622d656d8>,
<main.Node at 0x2d622d656d8>]
def fun6(a):
a[2]=5
lst=[1,1,1,1,1,1,1]
fun6(lst)
lst
[1, 1, 5, 1, 1, 1, 1]
def fun7(a):
a=[2,2,2,2,2,2]
a[2]=5
print(a)
lst=[1,1,1,1,1,1,1]
fun7(lst)
print(lst)
[2, 2, 5, 2, 2, 2]
[1, 1, 1, 1, 1, 1, 1]