Discuss / Python / 请问老师我的理解对吗?

请问老师我的理解对吗?

Topic source

脑洞开天

#1 Created at ... [Delete] [Delete and Lock User]

def add_end(L=[]): L.append('END') return L

终于想明白这段代码了,对于可变对象,如果对象内容改变,对象的内存地址不变。

也就是老师说的:Python函数在定义的时候,默认参数L的值就被计算出来了。

老师说的这个‘默认参数L的值’应该不是L的内容,而是L的内存地址。请问我理解的对吗?

脑洞开天

#2 Created at ... [Delete] [Delete and Lock User]

为什么object类首写字母是小写的?python怎么自己都不遵守规则呢?

廖雪峰

#3 Created at ... [Delete] [Delete and Lock User]

理解对了

廖雪峰

#4 Created at ... [Delete] [Delete and Lock User]

为什么object类首写字母是小写的?

发邮件问龟叔

you_you_k

#5 Created at ... [Delete] [Delete and Lock User]

不是吧 L应该类似于指针。 def add_append(L=[]) 系统在内存分配了一个位置给了[] 然后,给那个内存贴上了L这个标签. 因为这个[]是跟着函数同时存在的,所以[]没有被系统删除,应该当程序结束时,[]才被删除。 def add_append(L=None) 这个函数里面的[]应该是当函数运行完后就被删除,所以每次调用add_append()的时候,系统都会重新创建一个[]。 感觉应该是一个动态和静态的问题。

you_you_k

#6 Created at ... [Delete] [Delete and Lock User]

补: return 的时候应该类似于拷贝。

旭_317

#7 Created at ... [Delete] [Delete and Lock User]

楼上@you_you_k才是正解,系统中存在一个[]类型的对象。第二次调用的时候L对应的 存储单元里面存储的是[]这个对象的地址,这个地址和第一次地址是相同的。所以才会出现 这种结果。

L的本质其实就是一个指针。

L与其说是一个指针,不如说是一个引用。老师在第一节课上讲,如果

a = 1
b = a
a = 3

此时,b为1。因此L在此处相当于是一个指向这个创建的[]的一个引用。

def add_end(L=None): if L is None: L = [] return L print(id(add_end())) print(id(add_end()))

通过这段代码可知,两次[]的内存地址相同,所以you_you_k理解错误了

Tommy_Chiu

#10 Created at ... [Delete] [Delete and Lock User]

就像之前的一个同学说的,通过id函数查看即可,其实例子中无论L里面添加多少条END,它的内存地址是完全不变的


  • 1
  • 2

Reply