查看: 340|回复: 2

[Python] 浅谈写Python的时候遇到的坑

[复制链接]

0

技术

9

魅力

1

原创

版主

禁止访问

Rank: 7Rank: 7Rank: 7

积分
7734
人气
176
分享
52

最佳新人活跃会员

发表于 2023-8-1 08:39:28 | 显示全部楼层 |阅读模式
如题,我现在终于理解Bilibili为什么在2021年会崩溃了,就是因为Lua变量的类型导致的

我也遇到了一个类似的bug,我想写一个计时器,让用户输入年,分,秒,并转化成秒然后返回,具体代码如下:
[Python] 纯文本查看 复制代码
def getTime():
    hour = 0
    minute = 0
    second = 0 #我当时以为这样这三个参数就为int类型了XD
    hour = input("Hour $ ")
    minute = input("Minute $ ")
    second = input("Second $ ")
    result = hour * 60 * 60 + minute * 60 + second
    return result

当我输入0,0,0的时候,你们猜发生了什么
我的屏幕上出现了3661个0
为什么呢?
因为在Python中,一个变量可以接受不同类型的值
input函数返回的是字符串,又刚好python可以用字符串*数字,具体如下:
[Python] 纯文本查看 复制代码
string = "homo" * 2
print(string)
#输出:homohomo

所以产生了这样的bug
解决方案:
[Python] 纯文本查看 复制代码
hour = int(input("Hour $ "))
minute = int(input("Minute $ "))
second = int(input("Second $ "))

真是一个奇妙のbug
小菜鸡一枚~
Gitee主页:https://gitee.com/juruoqwq

2

技术

2

魅力

5

原创

略有小成

Rank: 4

积分
2797
人气
96
分享
31
发表于 2023-8-3 11:50:07 | 显示全部楼层
这是最基础的东西了,你也没讲明白

首先要明白一点,在input()当中用户输入的所有东西都是字符串类型的

其次,a=1中a默认是整型,b=1.1中b默认是浮点型,c="hello would"中c默认是字符串型

然后你就需要知道,整型和浮点型数据可以进行算数运算,而字符串不能进行算术运算
比如说,print(1+1),此时的两个1默认为整型数据,进行算术运算,相加之后等于2

但是,Python提供了对字符串的通用操作,包括连接、复制等
假如x和y变量都是字符串,x+y就代表连接两个字符串x和y,x*n就代表复制n次字符串x,len(x)就代表返回字符串x的长度
比如说,print ("1"+"1")或者print("1"*2),输出结果就是11,此时加号的含义是字符串操作当中的连接两个字符串,而不是算数运算当中的加号算术运算符

所以,你一开始的hour、minute、second变量都是字符串,在执行hour * 60 * 60 + minute * 60 + second语句是程序执行的并不是算数运算而是字符串操作,你最后将hour、minute、second在原本结果的基础上重新转化/定义为了一个整型数据再赋值给原本的变量,在执行hour * 60 * 60 + minute * 60 + second时因为变量都是整型数据,所以程序才进行了算数运算

不过,该段代码如果hour、minute、second输出了一个不可转化/定义为整型数据的字符串,即非整型数据的字符串时,将会报错

评分

参与人数 2经验 +45 收起 理由
xiaomeng + 30 很给力!
蒟蒻 + 15 很给力!

查看全部评分

0

技术

7

魅力

0

原创

版主

Rank: 7Rank: 7Rank: 7

积分
5100
人气
135
分享
5
发表于 2023-8-5 09:55:03 | 显示全部楼层
wwwab 发表于 2023-8-3 11:50
这是最基础的东西了,你也没讲明白

首先要明白一点,在input()当中用户输入的所有东西都是字符串类型的

你字多跟你混
Manners maketh man
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表