在Python中,布尔类型是否可变?

3

我有以下的Python代码:

def update(request, id):
  success = 0

  try:
    product = Mattress.objects.get(id=id)
    success = 1
  except Mattress.DoesNotExist:
    pass

  if success == 1:
    return render_to_response("success.html")
  else:
    return render_to_response('failure.html')

这段代码能否有效地检查"success"布尔值。如果代码通过try语句,"success"会被更改为1还是保持为0?


9
你的代码中没有布尔值,也没有进行任何变异操作。 - BrenBarn
这段代码存在一些问题。 - Wug
2
@goelv:1. 你的代码中没有布尔值。一个都没有。2. 你没有改变任何东西;你给success赋了一个全新的值。那不是改变。我建议你在这个主题上多读一些。 - Ed S.
@César:希望你是临时写的。 - Wug
你的意思很明显是指 success = Falsesuccess = True 而不是 01 - Ryan Haining
显示剩余3条评论
5个回答

11

回答你的问题:

在Python中,布尔值是否可变?

是和否都有。被赋予布尔值的变量通常是(也肯定是在这种情况下)可变的。另外,由于变量没有静态类型,它们也不限于被赋予布尔值。

但是,布尔值 TrueFalse 本身是不可变的。它们是单例,不能被修改。

看看你实际的代码:

if success = 1:

这不是有效的语法,你需要使用 == 。此外,从习惯上讲,你不应该使用 0 1 作为成功和失败的值,而应该使用 True False 。因此,你应该重构代码,像这样:

def update(request):
    success = False

    try:
        product = Mattress.objects.get(id=id)
        success = True
    except Mattress.DoesNotExist:
        pass

    if success:
        return render_to_response("success.html")
    else:
        return render_to_response('failure.html')

感谢帮忙!为了澄清和学习的缘故,快速提出一个问题:是否需要包含“success=false”? - goelv
1
是的(虽然F要大写,就像例子中一样)。每个变量在其值被检查之前都必须被赋值。 - David Robinson
1
@goelv 是的,否则你会因为尝试检查一个尚未被赋值的变量的值而得到一个 NameError 错误。 - Daniel DiPaolo
@DanielDiPaolo:请查看https://dev59.com/03E95IYBdhLWcg3wWMdQ#2351203以更好地理解打字术语。 - Noctis Skytower

1

也许你所提出的问题与你试图解决的问题无关。我认为有一种Pythonic的方法可以实现你想要的:

def update(request):
    try:
        product = Mattress.objects.get(id=id)
    except Mattress.DoesNotExist:
        template_name = 'failure.html'
    else:
        template_name = 'success.html'

    return render_to_response(template_name)

基本上,如果抛出异常,即将呈现的模板将是“failure.html”。另一方面,如果查询成功执行,“success.html”将被呈现。


1

是的。成功后success将被更改为1。


1

这段代码有几个问题。

  1. 首先,你没有使用布尔类型。Python的布尔值是TrueFalse
  2. 其次,你在if语句中没有进行比较。那一行在Python 3中是无效的。你要找的是:if success == 1:或者if success == True:
  3. 尽管布尔值是不可变的,但你仍然可以将布尔值赋给一个变量。我相信它们被存储为原始类型,所以它们和其他原始类型一样是不可变的。

1

您应该考虑使用实际的布尔值而不是整数。您可以将success设置为truefalse,Python会将它们解释为1和0的值的关键字。使用数字可能有些棘手,因为某些语言会以不同的方式解释事物。在某些语言中,0是false,但除了0之外的任何值都被认为是true。然而,对于您的问题,答案是肯定的,它可以正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接