请各位帮忙看看这个 Python 小程序错在哪里?挺简单的一个。。

2017-03-05 17:21:43 +08:00
 Newyorkcity
def upper_lower(Str):
    for i,c in enumerate(Str):
        print("i=%d,c=%c"%(i,c))
        if i == 0:
            c = c.upper()
            print(c)
        # else:
        #     c = c.lower()
        #     print(c)
    
    return Str

Li = ['adam', 'LISA', 'barT']
print(upper_lower(Li[0]));

主要是输出让我感觉比较奇诡

i=0,c=a
A #既然已经改成了 A
i=1,c=d
i=2,c=a
i=3,c=m
adam #为什么输出的时候却没变呢?

谢谢

1462 次点击
所在节点    问与答
12 条回复
sagaxu
2017-03-05 17:25:48 +08:00
>>> a=1
>>> b=a
>>> a,b
(1, 1)
>>> b=2
>>> a,b
(1, 2)


为什么 a 没有变成 2?
SuperMild
2017-03-05 17:31:17 +08:00
仔细看看代码,你改变了 c 的值,然后打印 c ,这就是变成 A 的原因。

但是 Str 的值没有改变呀,哪一句代码改变了 Str 的值?因此, Str 不变。
Biwood
2017-03-05 17:33:13 +08:00
不怎么会 python ,不过大概知道原因

把 c = c.upper() 这一句改成 Str[i] = c.upper() 就行了
arnofeng
2017-03-05 17:44:40 +08:00
你的 Str 在自定义函数里完全没被修改嘛
welkinzh
2017-03-05 17:50:55 +08:00
因为你没改变原列表呀 你只改变了 c
grimpil
2017-03-05 18:03:58 +08:00
@Biwood Python 好像不能直接修改 str 中指定 index 的值
Dvel
2017-03-05 18:12:50 +08:00
楼主应该就是想实现 capitalize()这个函数的功能吧。
就是首字母大写,其余小写, 按照楼主的思路可以这样:
def my_capitalize(aStr):
for i, c in enumerate(aStr[:]):
if i == 0:
aStr = c.upper()
else:
aStr += c.lower()
return aStr

简单的可以这样:
s = 'adam'
print(s[0].upper() + s[1:].lower())
Newyorkcity
2017-03-05 18:14:12 +08:00
@SuperMild
我这么理解可以吗?
如果用 C 语言的说法来理解,就相当于 c 只是指向一个新的存储空间,它不断的从 str 中遍历,取得值后保存在自己的内存空间。所以修改 c 的值不影响 str 本身。
谢谢
Newyorkcity
2017-03-05 18:21:38 +08:00
@Dvel
for i, c in enumerate(aStr[:]):
这里的这个切片有什么玄机吗?
不然的话第一个判断里
aStr = c.upper()
如果传入的是 adam
那这么一弄 aStr 不就变成了['a']了么。。怎么还能进行下去
Rice
2017-03-05 18:48:39 +08:00
因为字符串是不可变的。
bxb100
2017-03-05 18:50:46 +08:00
😂怪奇葩的,你想改变 Str 偏偏你没传递,再说 python 里面有 str.capitalize()方法啊
Dvel
2017-03-05 18:52:15 +08:00
@Newyorkcity #9 这个我也不懂,感觉遍历时有修改删除的话,弄个副本安全点吧。。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/345091

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX