先贴出源码吧,这段代码我想返回一个list,list中的元素由N个dict组成, dict中会包含目录下文件的名称,大小和最后修改时间(ps.大小和最后修改时间没有贴出来)

1

2

3

4

5

6

7

8

9

10

11

12

13import os

def listDirectory(path):

pathlist = []

info = {}

if os.path.isdir(path):

for f in os.listdir(path):

if not f.startswith('.'): #排除隐藏文件

info['name'] = f

pathlist.append(info) #将dict添加进list中

return pathlist,len(pathlist)

else:

return -1,-1

尝试去使用这个函数查询某个文件夹下的内容时,目录文件是如下所示:

1

2lishuo@DELL:~$ ls

connect.sh github nohup.out rjsupplicant tasks 下载

然而,在我调用这个函数去查询某个目录下的文件时,返回的list中只会显示这个文件夹下的最后一个文件,结果如下:

1

2

3

4

5

6

7

8

9

10

11In [1]: from disp_list import listDirectory

In [2]: listDirectory('/home/lishuo')

Out[2]:

([{'name': 'nohup.out'},

{'name': 'nohup.out'},

{'name': 'nohup.out'},

{'name': 'nohup.out'},

{'name': 'nohup.out'},

{'name': 'nohup.out'}],

6)

我感觉问题应该是和python的闭包有关,但是这段代码不知道该从何入手修改?请高手指导,感谢所有花时间阅读我的问题的人^_^

我来补充一点,有点进展,但是不知道为什么?

1

2

3

4

5

6

7

8

9

10

11

12

13import os

def listDirectory(path):

pathlist = []

if os.path.isdir(path):

for f in os.listdir(path):

info = {}

if not f.startswith('.'):

info['name'] = f

pathlist.append(info)

return pathlist,len(pathlist)

else:

return -1,-1

结果:

1

2

3

4

5

6

7

8

9

10

11In [1]: from disp_list import listDirectory

In [2]: listDirectory('/home/lishuo')

Out[2]:

([{'name': 'github'},

{'name': 'connect.sh'},

{'name': 'tasks'},

{'name': '\xe4\xb8\x8b\xe8\xbd\xbd'},

{'name': 'rjsupplicant'},

{'name': 'nohup.out'}],

6)

把info字典的定义放在for循环的里面,结果显示就正常了,百度知道查到的但是不知道为什么?字典是可变对象,初始化一定不能放在for循环内部,请问这是为什么?

首先得知道三点。

1、程序的运行是需要去内存中申请地址的。

2、赋值操作只是对于内存中某一块地址的引用。

3、Python 内置的 id()函数。 该函数从概念上可以理解为得到当前生命下的内存地址。

id(object)

Return the “identity” of an object. This is an integer which is guaranteed to be unique and constant for this object during its lifetime. Two objects with non-overlapping lifetimes may have the same id() value.

CPython implementation detail: This is the address of the object in memory.

由此我们可以得到以下结果:

1

2

3

4

5

6

7

8

9

10

11

12a = 1

b = 1

c = a

d = b

print(id(1)) # value x

print(id(a)) # value x

print(id(b)) # value x

print(id(c)) # value x

print(id(d)) # value x

print(id(1) == id(a) == id(b) == id(c) == id(d)) # True

在此基础上去看 字典/dict :

当声明一个字典 info = {} 的操作时候,该字典就已经在内存中获取了某一块地址。

对该字典进行操作时,如 info[‘name’] = ‘github’ 的时候,这个字典依旧是之前所占用的地址。

可通过id 函数跟踪得到以下代码:

1

2

3

4

5info = {}

print(id(info)) # value y

info['name'] = 'github'

print(id(info)) # value y

因此,对于你改进前的代码

pathlist.append(info)添加进去的始终是同一个info,准确的说,始终是同一块地址,而这个info内容在不停的修改。

参考以下代码:

1

2

3

4

5info = {'name': 'github'}

pathlist = [info,]

print(id(info)) # value z

print(id(pathlist[0])) # value z

然后,对于改进后的代码

info = {} 的操作放在了循环内,结果就是每一次循环都申请使用一段新的地址,只不过依旧用info来引用。

可由一下代码对比:

1

2

3

4

5info = {}

print(id(info)) # value m

info = {}

print(id(info)) # value n

两次打印的值是不等的。

另外

第一段代码中的

pathlist.append(info) #将dict添加进list中

这个注释,太 多 余 了。

希望能帮到你。

原始代码

listDirectory最终返回的是

1[info, info, info...]

而info每次循环都会更新,但最终必为

1{'name': last_loop_item}

所以会有那样的结果

更新代码

更新后的代码就比较直观了,

每次info都是新生成的dict,append的是每次循环产生的结果

pythonlist循环添加元素_list.append()在for循环中每次添加的都是最后的一个元素汗血宝马...相关推荐

  1. python循环中append_[Python]list.append()在for循环中每次添加的都是最后的一个元素

    首先得知道三点. 1.程序的运行是需要去内存中申请地址的. 2.赋值操作只是对于内存中某一块地址的引用. 3.Python 内置的 id()函数. 该函数从概念上可以理解为得到当前生命下的内存地址. ...

  2. python字典循环添加元素_牛鹭学院:学员笔记|python字典、列表、循环

    本文来自牛鹭学院学员:肖文芳 一.字典 (字典是什么呢?) 字典也是用来存放多种数据的容器,它和列表的功能相似,但是它是使用{}包起来的,而列表不是: 字典中的每一个元素都是一个单独的「键值对」,用英 ...

  3. part4-2 流程控制二(循环结构,while、for循环,列表推导式、生成器推导式,常用工具函数,控制循环结构,4个简单实例)...

    循环语句在循环条件满足时,可反复执行某一段代码,这段被重复执行的代码称为循环体.在循环体中,需要在合适的时候把循环条件设置为假,从而结束循环:否则循环一直执行下去形成死循环.循环语句通常包含如下4个部 ...

  4. 循环、推导式、多重循环

    目录 ❤  while循环 1.  语法格式 2.  while循环三要素 3.  死循环 ❤  for循环 1.  语法格式 2.  字典利用 items 内置函数进行 for 循环 ❤  rang ...

  5. python循环队列_JS 队列-优先队列、循环队列

    <学习JavaScript数据结构与算法>读书笔记. 队列是遵行FIFO(First In First Out, 先进先出)原则的一组有序的项.队列再尾部添加新元素,并从顶部移除元素. 在 ...

  6. python用for循环输出直角三角形_使用FOR循环语句在屏幕上输出一个由星号组成的直角三角形...

    题目要求: 请用C++的信息输出方式,使用循环语句在屏幕上输出一个由星号组成的直角三角形,形状如下: * ** *** **** ***** 要求: 完全使用C++的信息输出方式,即cout以及流插入 ...

  7. python用循环输入给数组赋值_python 循环数据赋值实例

    python 循环数据赋值实例 python在数值赋值的时候可以采用数值内循环赋值,很方便 如下 a = [x for x in range(10)] 这样 a = [0,1,2,3,4,5,6,7, ...

  8. 为什么双层循环 冒泡排序_冒泡排序的双重循环理解

    主要说一下冒泡排序的一些关键地方的个人理解,比如算法思想,两个循环的作用意义,中间循环变量范围的确定等. 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面 ...

  9. 卡巴循环30天不限次数循环试用工具

    本文需评论之后方可查看! @echo off @title 卡巴循环30天不限次数循环试用工具 @echo off echo 卡巴循环30天不限次数循环试用工具 echo. echo ======== ...

最新文章

  1. 【登录异常解决】Ubuntu 输入正确的密码后重新返回到登陆界面
  2. Kafka常用操作命令总结
  3. DL之AlexNet:利用卷积神经网络类AlexNet实现猫狗分类识别(图片数据增强→保存h5模型)
  4. 【竞赛总结】新冠期间饿了么骑士行为预估
  5. [转]多线程更新Processbar
  6. 通过单步调试的方式学习 Angular 中 TView 和 LView 的概念
  7. LLVM完整参考安装
  8. stl中Priority Queues(优先队列)的基本用法
  9. java迭代器删除两个_两个迭代器的故事
  10. angularjs1访问子组件_Vue学习笔记之组件的应用
  11. hook 监控文件 c++_技术分享 | Linux 入侵检测中的进程创建监控
  12. 2.2.2 物理层设备(中继器、集线器)(转载)
  13. 使用spring cloud,nacos,dubbo,gateway搭建微服务
  14. 32.卷1(套接字联网API)---IPv4,IPv6,ICMPv4 和 ICMPv6
  15. 分类损失函数多元分类_二元分类为什么不能用MSE做为损失函数?
  16. UI设计开发工具介绍
  17. 使用python将视频中的音频分离出来
  18. python软件长什么样子图片_使用Python把多个图片拼接成为长图
  19. Windows环境下 .Net PetaPoco 配置 Mysql
  20. HFDS的Shell操作

热门文章

  1. Jsp+SpringMVC+Mysql实现的进销存库存管理系统附带论文
  2. Ssh+Mysql实现的Java Web图书商城
  3. Ssm在线商城系统实战开发
  4. 基于JAVA+Servlet+JSP+MYSQL的党员信息管理系统
  5. 基于JAVA+Servlet+JSP+MYSQL的校园门户信息管理系统
  6. opc怎么在计算机上测试,OPC测试
  7. mac 连接hbase的图形化界面_Mac 视觉史(二):90 年代失败 Mac 操作系统大赏
  8. ubuntu没有进入图形界面解决办法
  9. 最常见的Web服务器市场份额
  10. c#中using 和new