Python影院座位规划问题:购座后选新座误提示已占用
Hey there! Let’s work through this frustrating bug together—it’s never fun when a system incorrectly marks a free seat as taken. Here are the most common culprits and how to fix them:
1. Shared References in Your Seat Matrix (Super Common Python Pitfall)
If you initialized your seat grid using a shortcut like this:
rows = 5 cols = 5 seats = [["available"] * cols] * rows
You’re actually creating a matrix where every row is a reference to the same list. That means when you mark one seat as taken, all rows will have that seat marked as taken—even if the user picked a different row.
Fix this by initializing each row independently:
seats = [["available" for _ in range(cols)] for _ in range(rows)]
2. Off-by-One Errors with Row/Seat Indices
Users typically enter 1-based numbers (e.g., "Row 1, Seat 1") but Python uses 0-based indexing. If you forget to subtract 1 when mapping user input to your matrix indices, you’ll end up checking/modifying the wrong seat every time.
Example of the mistake:
user_row = int(input("Enter row number: ")) user_seat = int(input("Enter seat number: ")) if seats[user_row][user_seat] == "taken": # Uses 1-based index directly print("This seat has already been taken")
Fix it by adjusting to 0-based:
user_row = int(input("Enter row number: ")) - 1 user_seat = int(input("Enter seat number: ")) - 1 if seats[user_row][user_seat] == "taken": print("This seat has already been taken")
3. Accidental Assignment Instead of Comparison
Double-check your seat status check for typos. If you used a single = (assignment) instead of == (comparison), you’ll always get a "taken" message because you’re setting the seat to taken before checking it:
Mistake:
if seats[user_row][user_seat] = "taken": # Oops, assignment not comparison
Correct version:
if seats[user_row][user_seat] == "taken":
4. Unupdated or Misplaced Seat State
Make sure you’re:
- Storing the seat state in a persistent variable (not reinitializing the matrix every time the user selects option 4)
- Correctly marking the seat as taken only after verifying it’s available
For example, your booking flow should look like:
def book_seat(seats): user_row = int(input("Enter row number: ")) - 1 user_seat = int(input("Enter seat number: ")) - 1 # Validate input first (optional but good practice) if user_row < 0 or user_row >= len(seats) or user_seat < 0 or user_seat >= len(seats[0]): print("Invalid row or seat number!") return if seats[user_row][user_seat] == "taken": print("This seat has already been taken") else: seats[user_row][user_seat] = "taken" print("Seat booked successfully!")
Quick Debugging Tip
Add print statements to log the user’s input and the corresponding seat state before the error message. This will help you confirm if the system is actually targeting the seat the user selected:
print(f"Checking row {user_row}, seat {user_seat}") print(f"Current status: {seats[user_row][user_seat]}")
If you can share snippets of your code (like the option 4 handler, seat matrix initialization, or booking logic), we can pinpoint the exact issue even faster!
内容的提问来源于stack exchange,提问作者Aspext

