我是靠谱客的博主 淡然摩托,最近开发中收集的这篇文章主要介绍python的for循环语句赋值给url_python中for语句中对当前遍历对象赋值的问题?,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Python 中 for 遍历通常不建议(不是不能)直接修改遍历对象本身,因为这样就会出现类似如下的问题:

n = [1, 2, 3]

for i in n:

n.append(i)

print(i)

上段程序会进入无限死循环,因为 n 在每次迭代时,长度都会增加,因此for永远不可能穷尽,所以我们通常会使用迭代对象的副本进行遍历:

n = [1, 2, 3]

for i in n[:]:

n.append(i)

print(i)

这样就可以修改n的值,也可以顺利完成遍历。

现在回到你的例子的第一段程序中:

def loadCsv(filename):

# 取出数据

lines = csv.reader(open(filename, 'rb'))

# 存入dataset

dataset = list(lines)

for data in dataset:

for i in data:

i = float(i) #这里前后两个`i`其实指代的是不同的对象

return dataset

事实上,你的i = float(i) 前后两个指代的根本不是同一个对象,后一个 i 是 data的元素,前一个 i 则是loadCsv作用域内的局部变量,这里涉及到 Python 语言设计中的一个不合理的地方,来看一段程序:

for i in range(3):

pass

print(i)

# 2

也就是说参与迭代的标识符 i 在退出 for 循环之后,仍然没有被回收,并且保留着与迭代最后一个值之间的关联,这对同名的全局变量会造成影响,时常会出现这样的错误:

i = 7

for i in range(3):

pass

print(i)

# 2

一个 for 循环之后,全局变量 i 的值尽然莫名其妙的变了,原因在于 i 其实并非对象本身,而是对象的标识符,Python 的标识符并非对象的属性,而是可以复用的命名空间的一部分。

因此当 for 循环内有同名的 i 标识符被赋值时,情况就又不一样了:

for i in range(5):

i = 3

print(i)

# 3

这里 i 的值完全等同于 for 内给它的赋值,原因在于 Python 中的赋值操作,就是将值对象与标识符关联的操作,最后一次迭代时,数值 3 会被关联到标识符 i,因此 i 就被绑定到新的对象上了,回到你的第一段程序,情况也就是如此:i = float(i) 是将值对象 float(i) 绑定到标识符 i,因此赋值后的 i 压根不是 data的元素对象,因此不会更改 dataset。

而你的第二段程序:

def loadCsv(filename):

# 取出数据

lines = csv.reader(open(filename, 'rb'))

# 存入dataset

dataset = list(lines)

for i in range(len(dataset)):

dataset[i] = [float(x) for x in dataset[i]]

return dataset

for 内的 i 只是个索引,你修改的不是i,而是 dataset[i]标识符关联的对象 ,而dataset[i]则是dataset的组成元素,因此可以更改data。

关于标识符和命名空间,可以看一下这篇文章:Python 的命名空间

最后

以上就是淡然摩托为你收集整理的python的for循环语句赋值给url_python中for语句中对当前遍历对象赋值的问题?的全部内容,希望文章能够帮你解决python的for循环语句赋值给url_python中for语句中对当前遍历对象赋值的问题?所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部