关于引用传递

#python3.1.1

import random

list_p=list()
dict_p=dict()
for v in range(10):
    dict_p['a']=random.randrange(0,100)
    list_p.append(dict_p)
print(list_p)

list_x=list()
for v in range(10):
    dict_x=dict()
    dict_x['a']=random.randrange(0,100)
    list_x.append(dict_x)
print(list_x)

 

输出:

[{'a': 35}, {'a': 35}, {'a': 35}, {'a': 35}, {'a': 35}, {'a': 35}, {'a': 35}, {'a': 35}, {'a': 35}, {'a': 35}]
[{'a': 51}, {'a': 98}, {'a': 60}, {'a': 13}, {'a': 25}, {'a': 7}, {'a': 58}, {'a': 54}, {'a': 53}, {'a': 13}]

 

关于对象,pytho只是应用传递,对一个对象幅值,其实是创建新的对象,而不是修改原来的对象

第一行输出完全一样,因为dict_p只是被一次赋值,而list_p.append(dict_p)是引用传递,并未复制一个对象的copy到list_p内

第二行输出值不一样,因为每次都是通过 dict_x=dict()创建新的对象

 

x=list(range(6))

y=x

random.shuffle(y)

print(x)

[4, 0, 1, 5, 3, 2]

print(y)

[4, 0, 1, 5, 3, 2]

 

def fun1(x):
    for nx in range(len(x)):
        x[nx]+=10
    print('x in fun1',x)

def fun2(x):
    x=len(x)*[0]
    for nx in range(len(x)):
        x[nx]+=10
    print('x in fun2',x)
x=list(range(10))
print(x)
fun1(x)
print(x)
fun2(x)
print(x)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
x in fun1 [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
x in fun2 [10, 10, 10, 10, 10, 10, 10, 10, 10, 10]
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

fun2通过x=len(x)*[0]创建一个新的变量,而不是修改最初的x;同理fun1一直是修改x而不是创建新的变量。

fun1修改传递给它的变量,而fun2创建一个新的变量

 

你可能感兴趣的:(list,python,import,fun)