【问题标题】:Are booleans mutable in python?布尔值在python中是可变的吗?
【发布时间】:2012-08-08 04:14:22
【问题描述】:

我在 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')

此代码是否是检查“成功”布尔值的有效方法。如果代码通过了try语句,“success”会变成1还是保持在0?

【问题讨论】:

  • 你的代码中没有布尔值,你也没有改变任何东西。
  • 这个 sn-p 存在许多问题。
  • 我有多个 try-except 块,这就是为什么我没有在 try-except 块内返回。实现我需要的这个布尔功能的正确方法是什么?
  • @goelv: 1. 你的代码中没有布尔值。没有。 2. 你没有改变任何东西;您正在分配 success *全新的值`。那不是突变。我建议阅读一些有关该主题的内容。
  • 不知道你使用的id是从哪里来的

标签: python django boolean


【解决方案1】:

回答你的问题:

python 中的布尔值是可变的吗?

是和不是。分配了布尔值的变量(可能总是,并且在这种情况下肯定)是可变的,是的。它们也不限于被分配布尔值,因为变量不是静态类型的。

但是布尔值 True 和 False 本身是不可变的。它们是无法修改的单例。

查看您的实际代码:

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”?
  • Yes(尽管在示例中使用大写 F)。每个变量都必须在检查其值之前分配给它。
  • @goelv 是的,否则您将收到 NameError 表示失败,因为您将尝试检查尚未分配给的变量的值
  • @DanielDiPaolo:请参阅stackoverflow.com/a/2351203/216356 以更好地理解键入术语。
【解决方案2】:

是的。成功时success 将更改为 1。

【讨论】:

    【解决方案3】:

    这个 sn-p 有一些问题。

    1. 首先,您没有使用布尔类型。 Python 的布尔值是 True 和 False。
    2. 其次,您没有在 if 语句中进行比较。该行在 Python 3 中无效。您要查找的是:if success == 1: 或 if success == True:
    3. 您仍然可以将布尔值分配给变量,而不管布尔值的不变性如何。我相信它们被存储为原始类型,因此它们与任何其他原始类型一样不可变。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        您提出的问题可能甚至与您要解决的问题无关。我认为有一种 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'。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-12-02
          • 2022-11-14
          • 1970-01-01
          • 2014-12-05
          • 2019-10-15
          • 2019-02-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多