我正在使用包含2列的CSV文件,第一个是格式为yyyymmdd的日期列,第二个是浮点格式的字符串值,例如0.0。
import csv
file = open('Precipitation.csv')
date_file = csv.reader(file)
dec = 0.0
for k in date_file:
full_date = k[0]
month = full_date[4:-2]
rain_amount = k[1]
float(month)
if month == "12":
float(rain_amount)
dec += rain_amount
print(dec)
我通过使用type(rain_amount)继续检查rain_amount的类型,并且它一直注册为“str”。我究竟做错了什么?我一直在努力检查和做不同的事情,但我找不到问题。我肯定做错了什么,但我一直在看这个太长时间才弄明白。帮助
答案 0 :(得分:3)
float()
不会就地修改变量,它会返回新的类型值。将其分配回来:
rain_amount = float(rain_amount)
答案 1 :(得分:3)
float()
函数不更改其参数 - 它计算所需的适当浮点数并将其作为新对象返回,因此如果需要,您必须将其保存在某处使用它。如果您愿意,可以将float()
调用与更新步骤结合使用,例如:
dec += float(rain_amount)
您可能想知道为什么 Python就是这样。
如Python Data model docs
中所述对象的类型确定对象支持的操作 (例如,“它有长度吗?”)并且还定义了可能的值 对于那种类型的对象。
type()
函数返回对象的类型 (这是一个对象本身)。与其标识一样,对象的类型是 也是不可改变的。[脚注]在某些情况下 可以更改对象的类型 受控条件。但是,它通常不是一个好主意 如果处理不当,可能会导致一些非常奇怪的行为。
因此,一般来说,最好将对象的类型视为不可更改的。我们可能会随便谈论将字符串转换为浮点数,但这实际上只是说我们正在创建一个浮点对象,其数值对应于字符串对象的内容。
您不仅无法更改对象的类型,对于许多基本的Python对象类型,您甚至无法更改其值!这些对象称为 immutable ;常见的不可变类型包括所有数字类型,字符串和元组。除了元组之外,大多数内置容器类型(列表,字典和集合(但不是frozensets))都是可变的,这意味着可以修改其内容。
所以,如果你这样做
s = 'Sam'
s += 'my'
您实际上并未更改字符串对象s
:您不能,因为它是不可变的。而是创建一个包含'Sammy'
的新字符串对象,然后将新对象绑定到名称s
,并丢弃包含'Sam'
的旧对象。
同样,如果你这样做
a = 1
a += 1
创建一个新的整数对象,其值为a+1
,并且该新对象绑定到名称a
。
有关此主题的更多信息,请参阅SO退伍军人Ned Batchelder的Facts and myths about Python names and values。
答案 2 :(得分:1)
您没有存储更新的QCompleter
类型。你必须把它归还。
这样做:
float