python函数对于列表,字典等结构为什么要默认传址?

我很费解这一点,php写多了,今天准备用python写算法题,因为人家没提供php编译器。
折腾了几个小时,也没会玩儿这字典列表和函数传址是怎么回事。

def my_cazz(n,l):
    temp = n;
    count = 0;
    l.append(n);
    while (n!=1):
        if (n % 2 == 0):
            n = int(n/2);
        else:
            n = int((3 * n + 1) / 2);
        count = count + 1;
        l.append(n);

# def cmp_list(l1,l2):
#     li[0]

# n = int(raw_input());
# myinput = raw_input();
myinput = "2 3 4 5 6 7 8 10 12 14 15 16 17 18";

mylist = myinput.split(' ');

count = 0;
dic = {};
li = [];
for x in mylist:
    dic[int(x)] = li;
    my_cazz(int(x),dic[int(x)]);

for k in dic:
    print dic[k];
阅读 3.9k
3 个回答

没看懂你代码具体要表达什么,我就按照你的题目回答。
并不是Python中的函数对于列表和字典默认传址,而是函数接收的参数都默认传引用,也就是说的传址。
参数变量在函数的作用域里面是不同于外部的变量,虽然一开始它们都引用了同样的对象。
对于对象来说,分为可变对象和不可变对象,一个变量引用了不可变对象,又要改变其值的话,其实就是改变了引用,因为其引用的对象不可变。所以当传递给函数的参数是不可变对象的话,在函数内修改该参数变量,会导致参数变量改变了引用,而对于可变对象就不会有这个问题,这样就使得看起来像c语言中函数传值和传址。

当字典长度过大时,数值的拷贝会耗费大量时间

这些都是很大一坨,copy过去会很郁闷的(房子从来给地址,不会把房子运到你面前的)

相反,传个地址过去就好了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题