首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >python循环和字符串的语义

python循环和字符串的语义
EN

Stack Overflow用户
提问于 2010-07-08 17:39:04
回答 4查看 350关注 0票数 2

考虑:

代码语言:javascript
运行
复制
args = ['-sdfkj']
print args
for arg in args:
    print arg.replace("-", '')
    arg = arg.replace("-", '')
print args

这产生了:

代码语言:javascript
运行
复制
['-sdfkj']
sdfkj
['-sdfkj']

我以为它是['sdfkj']

循环中的arg是副本吗?

它的行为就好像它是一个副本(或者可能是一个不可变的思想家,但是我希望会抛出一个错误.)

注意:我可以通过理解列表得到正确的行为。我对上述行为的原因感到好奇。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-07-08 17:42:48

是循环中的arg吗?

是的,它包含一份参考资料的副本。

当您重新分配arg时,您没有修改原始数组,也没有修改其中的字符串(字符串是不可变的)。只修改局部变量arg指向的内容。

代码语言:javascript
运行
复制
Before assignment         After assignment

args          arg          args          arg
  |            |            |            |
  |            |            |            |
(array)        /          (array)       'sdfkj'
  |[0]        /             |[0]        
   \         /              |
    \       /               |
     '-sdfkj'            '-sdfkj'
票数 8
EN

Stack Overflow用户

发布于 2010-07-08 17:55:03

既然你在你的问题中提到,你知道可以用列表理解来完成,所以我不打算向你展示这种方式。

正在发生的情况是,对每个值的引用被复制到变量arg中。最初,它们都引用相同的变量。重新分配arg后,它引用新创建的变量,而列表中的引用保持不变。这与字符串在Python中是不可变的这一事实无关。尝试使用可变类型。

一种非列表理解的方法是修改列表:

代码语言:javascript
运行
复制
for i in xrange(len(args)):
    args[i]=args[i].replace('-','')
print args
票数 1
EN

Stack Overflow用户

发布于 2010-07-08 17:56:29

如果要修改实际列表,则必须将更改具体分配给列表'args.‘’。

代码语言:javascript
运行
复制
for arg in args:
    if arg == "-":
        args[arg] = args[arg].replace("-", '')
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3206375

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档