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 #为什么输出的时候却没变呢?
谢谢
1
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? |
2
SuperMild 2017-03-05 17:31:17 +08:00 1
仔细看看代码,你改变了 c 的值,然后打印 c ,这就是变成 A 的原因。
但是 Str 的值没有改变呀,哪一句代码改变了 Str 的值?因此, Str 不变。 |
3
Biwood 2017-03-05 17:33:13 +08:00
不怎么会 python ,不过大概知道原因
把 c = c.upper() 这一句改成 Str[i] = c.upper() 就行了 |
4
arnofeng 2017-03-05 17:44:40 +08:00
你的 Str 在自定义函数里完全没被修改嘛
|
5
welkinzh 2017-03-05 17:50:55 +08:00 via Android
因为你没改变原列表呀 你只改变了 c
|
7
Dvel 2017-03-05 18:12:50 +08:00 1
楼主应该就是想实现 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()) |
8
Newyorkcity OP @SuperMild
我这么理解可以吗? 如果用 C 语言的说法来理解,就相当于 c 只是指向一个新的存储空间,它不断的从 str 中遍历,取得值后保存在自己的内存空间。所以修改 c 的值不影响 str 本身。 谢谢 |
9
Newyorkcity OP @Dvel
for i, c in enumerate(aStr[:]): 这里的这个切片有什么玄机吗? 不然的话第一个判断里 aStr = c.upper() 如果传入的是 adam 那这么一弄 aStr 不就变成了['a']了么。。怎么还能进行下去 |
10
Rice 2017-03-05 18:48:39 +08:00 via iPhone
因为字符串是不可变的。
|
11
bxb100 2017-03-05 18:50:46 +08:00 via Android
😂怪奇葩的,你想改变 Str 偏偏你没传递,再说 python 里面有 str.capitalize()方法啊
|
12
Dvel 2017-03-05 18:52:15 +08:00
@Newyorkcity #9 这个我也不懂,感觉遍历时有修改删除的话,弄个副本安全点吧。。。
|