找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 5411|回复: 14

[求助] 这里函数为什么没有修改列表?

26

主题

84

帖子

84

积分

新手

积分
84
银发的index 发表于 2018-5-6 11:01:22 | 显示全部楼层 |阅读模式
本帖最后由 银发的index 于 2018-5-6 11:03 编辑

def make_great(magic_names,new_names):
    while magic_names != []:
        current = magic_names.pop()
        new_names.append(current)
#这里
   new_names = [
    new_name + ' the great ' for new_name in new_names]
#这里又加了个print
    print(new_names)
    return new_names

magic_names = ['liu','li','zhao']
new_names = []
print(make_great(magic_names,new_names))
print(new_names)
#运行结果是前两个是带 the great的
#第三个是不带 the great 也不是空的。
#不是空的说明上面的函数已经修改了列表new_names了。
#为什么只是修改到添加元素,后面的修改每个列表元素 (在后面加上'the great ')却没有进行呢?

回复

使用道具 举报

0

主题

956

帖子

956

积分

圣骑士

积分
956
sheeboard 发表于 2018-5-6 11:18:59 | 显示全部楼层
这个结果?
Screenshot from 2018-05-06 11-17-51.png
回复

使用道具 举报

26

主题

84

帖子

84

积分

新手

积分
84
银发的index  楼主| 发表于 2018-5-6 11:21:53 | 显示全部楼层

是要这个结果。不过为什么返回的names既不是空的也不是带the great的呢?
回复 支持 反对

使用道具 举报

26

主题

84

帖子

84

积分

新手

积分
84
银发的index  楼主| 发表于 2018-5-6 11:27:41 | 显示全部楼层

我的意思是通过调用函数make_great 可以得到 带 the great 的列表,也就是函数能达到要求。
然后调查列表new_names 发现new_names 也确实不是空的,说明函数make_great修改了new_names。
既然修改了为什么修改后的new_names没有带 the great 呢?
回复 支持 反对

使用道具 举报

0

主题

956

帖子

956

积分

圣骑士

积分
956
sheeboard 发表于 2018-5-6 11:36:17 | 显示全部楼层
本帖最后由 sheeboard 于 2018-5-6 11:38 编辑

缩进不对
Screenshot from 2018-05-06 11-35-42.png
Screenshot from 2018-05-06 11-37-03.png
回复

使用道具 举报

3

主题

278

帖子

278

积分

侠客

积分
278

热心会员

uitb 发表于 2018-5-6 13:39:05 | 显示全部楼层
  1. def make_great(magic_names,new_names):
  2.     while magic_names != []:
  3.         current = magic_names.pop()
  4.         print (2,id(new_names))
  5.         new_names.append(current)
  6.     print (3,id(new_names))
  7.     new_names = [new_name + ' the great ' for new_name in new_names]
  8.     print(4,id(new_names))
  9.     print(new_names)
  10.     return new_names

  11. magic_names = ['liu','li','zhao']
  12. new_names = []
  13. print (1,id(new_names)) #打印变量的内存地址
  14. print(make_great(magic_names,new_names))
  15. print(new_names)
复制代码
QQ截图20180506133312.png 看样子,是在你添加“the great”的这一步,变量的内存地址发生的变化,也就是说它是重新在函数内定义了一个局部变量new_names,而不是函数外部的new_names,但是在new_names.append的时候,还是用的外部的变量,所以就出现了你这种情况,具体为什么会这样的深层原因我就不知道了
回复 支持 反对

使用道具 举报

26

主题

84

帖子

84

积分

新手

积分
84
银发的index  楼主| 发表于 2018-5-6 14:37:32 | 显示全部楼层
uitb 发表于 2018-5-6 13:39
看样子,是在你添加“the great”的这一步,变量的内存地址发生的变化,也就是说它是重新在函数内定义了一 ...

哇~感觉好厉害的样子~
那如果要达到我说的那种应该怎么写呢。
还有为什么用列表解析得出的结果和普通定义列表得到的结果不同呢(应该也是这个内存的问题)
magic_names= ['liu']
magic_names= [
    magic_name + ' the great ' for magic_name in magic_names]
print(magic_names)
#和
magic_names = ['li']
for magic_name in magic_names:
      magic_name += 'the great'
print(magic_names)
#如果第二种要达到第一种效果应该怎么写?

回复 支持 反对

使用道具 举报

26

主题

84

帖子

84

积分

新手

积分
84
银发的index  楼主| 发表于 2018-5-6 14:41:43 | 显示全部楼层

和你的是一个缩进啊,就是你print(new_names)应该是一个空的列表或者是带the great的列表。
但是打出来是 不带the great 的非空列表。按照下面的说法是调用过程中新创建了个局部变量。
回复 支持 反对

使用道具 举报

0

主题

956

帖子

956

积分

圣骑士

积分
956
sheeboard 发表于 2018-5-6 15:12:46 | 显示全部楼层
def里参数是两个占位符而已,实际参数用了两个变量,只是名字一样而已,funcion里面访问外部的全局变量是可以的,我估计是前面操作变量已经变化了,所以再运行function需要初始化一下作为参数的变量。
回复 支持 反对

使用道具 举报

26

主题

84

帖子

84

积分

新手

积分
84
银发的index  楼主| 发表于 2018-5-6 15:25:47 | 显示全部楼层
sheeboard 发表于 2018-5-6 15:12
def里参数是两个占位符而已,实际参数用了两个变量,只是名字一样而已,funcion里面访问外部的全局变量是可 ...

那要怎么写才能得到 修改为 带the great 的new_names 列表呢?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表